﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace QLNSTL
{
    public partial class Form1 : Form
    {
        #region Biến toàn cục và hàm khởi tạo
        bool NghiPhep_Loaded = false;
        bool KhenThuong_Loaded = false;
        bool KyLuat_Loaded = false;
        bool HopDong_Loaded = false;
        public Form1()
        {
            InitializeComponent();
            treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
            dataGridView1.CellDoubleClick += new DataGridViewCellEventHandler(dataGridView1_CellDoubleClick);
        }
        #endregion

        #region Xử lý sự kiện của gridView chính
        void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0)
            {
                return;
            }
            if (dataGridView1.Rows[e.RowIndex].Cells["MaNV"].Value != DBNull.Value)
            {
                Thong_Tin_Nhan_Vien ttnv = new Thong_Tin_Nhan_Vien(int.Parse(dataGridView1.Rows[e.RowIndex].Cells["MaNV"].Value.ToString()));
                if (ttnv != null)
                {
                    if(ttnv.ShowDialog()== DialogResult.OK)
                        Load_DataGridView1();
                }

            }
        }
        #endregion

        #region Load dữ liệu ban đầu
        private DataTable ConvertData(IQueryable<NhanVien> LinqTable)
        {
            DataTable result = new DataTable();
            result.Columns.Add("MaNV");
            result.Columns.Add("Họ Tên");
            result.Columns.Add("Giới tính");
            result.Columns.Add("Phòng ban");
            result.Columns.Add("Chức vụ");
            result.Columns.Add("Số điện thoại");
            result.Columns.Add("Tình trạng");

            foreach (var r in LinqTable)
            {
                DataRow row = result.NewRow();
                row["MaNV"] = r.maNV;
                row["Họ Tên"] = r.hoTen;
                row["Giới tính"] = (bool)r.gioiTinh ? "Nam" : "Nữ";
                if (r.PhongBan != null)
                {
                    row["Phòng ban"] = r.PhongBan.tenPhongBan; 
                }
                if (r.ChucVu != null)
                {
                    row["Chức vụ"] = r.ChucVu.tenChucVu; 
                }
                row["Số điện thoại"] = r.soDT;
                row["Tình trạng"] = (bool)r.active ? "Đang làm việc" : "Đã nghỉ việc";
                result.Rows.Add(row);
            }
            return result;
        }

        private void Load_DataGridView1()
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            var TatCaNhanVien = from c in dc.NhanViens
                                where c.active == true
                                orderby c.maNV descending
                                select c;
            if (checkBox1.Checked)
            {
                TatCaNhanVien = from c in dc.NhanViens
                                orderby c.maNV descending
                                select c;
            }
            dataGridView1.DataSource = ConvertData(TatCaNhanVien);
            dataGridView1.Columns["MaNV"].Visible = false;
            //DataGridViewCellStyle ds = new DataGridViewCellStyle();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Load dữ liệu cho dataGridView
            QLNS_TLDataContext dc = new QLNS_TLDataContext();

            //Load dữ liệu cho TreeView
            //Tất cả
            treeView1.Nodes.Add("Tất cả nhân viên");
            //Phòng ban
            treeView1.Nodes.Add("Phòng ban", "Phòng ban");
            var PBs = from pb in dc.PhongBans
                      select pb;
            foreach (var item in PBs)
            {
                treeView1.Nodes["Phòng ban"].Nodes.Add(item.tenPhongBan, item.tenPhongBan);
            }
            //Chức vụ
            treeView1.Nodes.Add("Chức vụ", "Chức vụ");
            var CVs = from cv in dc.ChucVus
                      select cv;
            foreach (var item in CVs)
            {
                treeView1.Nodes["Chức vụ"].Nodes.Add(item.tenChucVu, item.tenChucVu);
            }

            Load_DataGridView1();
        }
        #endregion

        #region Xử lý sự kiện của TreeView
        void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Text == "Tất cả nhân viên")
            {
                QLNS_TLDataContext dc = new QLNS_TLDataContext();
                var TatCaNhanVien = from c in dc.NhanViens
                                    where c.active == true
                                    orderby c.maNV descending
                                    select c;
                if (checkBox1.Checked)
                {
                    TatCaNhanVien = from c in dc.NhanViens
                                    orderby c.maNV descending
                                    select c;
                }
                dataGridView1.DataSource = ConvertData(TatCaNhanVien);
                return;
            }
            if (e.Node.Level == 1)
            {
                if (e.Node.Parent.Text == "Phòng ban")
                {
                    QLNS_TLDataContext dataContext = new QLNS_TLDataContext();

                    var NVTheoPhong = from c in dataContext.NhanViens
                                      where c.PhongBan.tenPhongBan == e.Node.Text && c.active == true
                                      orderby c.maNV descending
                                      select c;
                    if (checkBox1.Checked)
                    {
                        NVTheoPhong = from c in dataContext.NhanViens
                                      where c.PhongBan.tenPhongBan == e.Node.Text
                                      orderby c.maNV descending
                                      select c;
                    }
                    dataGridView1.DataSource = ConvertData(NVTheoPhong);
                }
                if (e.Node.Parent.Text == "Chức vụ")
                {
                    QLNS_TLDataContext dataContext = new QLNS_TLDataContext();
                    var NVTheoPhong = from c in dataContext.NhanViens
                                      where c.ChucVu.tenChucVu == e.Node.Text && c.active == true
                                      select c;
                    if (checkBox1.Checked)
                    {
                        NVTheoPhong = from c in dataContext.NhanViens
                                      where c.ChucVu.tenChucVu == e.Node.Text
                                      select c;
                    }
                    dataGridView1.DataSource = ConvertData(NVTheoPhong);
                }
            }
        }
        #endregion

        #region tìm kiếm
        private void btTimNhanh_Click(object sender, EventArgs e)
        {
            if (KeySearch.Text.Length > 0)
            {
                QLNS_TLDataContext dataContext = new QLNS_TLDataContext();
                var NVTheoPhong = from c in dataContext.NhanViens
                                  where c.hoTen.Contains(KeySearch.Text)
                                  select c;
                dataGridView1.DataSource = ConvertData(NVTheoPhong);
                
            }
        }
        #endregion
        
        #region Load các table bổ trợ thông tin cho nhân viên
        private void Load_NghiPhep(int MaNV)
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            var nghipheps = from np in dc.NghiPheps
                            where np.maNV == MaNV
                            select np;
            try
            {
                nghipheps.First();
                dataGridViewNghiPhep.DataSource = nghipheps;
                dataGridViewNghiPhep.Columns["maNghiPhep"].Visible = false;
                dataGridViewNghiPhep.Columns["maNV"].Visible = false;
                dataGridViewNghiPhep.Columns["ngayBatDau"].HeaderText = "Ngày bắt đầu nghỉ";
                dataGridViewNghiPhep.Columns["soNgay"].HeaderText = "Số ngày nghỉ";
                dataGridViewNghiPhep.Columns["lyDo"].HeaderText = "Lý do";
            }
            catch (Exception)
            {
                dataGridViewNghiPhep.Rows.Clear();
            }
        }

        private void Load_KhenThuong(int MaNV)
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            //NhanVien nv = new NhanVien();
            var khenthuongs = from kt in dc.Chitietkhenthuongs
                              where kt.maNV == MaNV
                              select new
                              {
                                  makt = kt.maKhenThuong,
                                  ngay = kt.KhenThuong.NgayKy,
                                  thanhtich = kt.KhenThuong.thanhTich,
                                  hinhthuc = kt.KhenThuong.hinhThuc,
                                  trigia = kt.KhenThuong.triGia
                              };
            try
            {
                khenthuongs.First();
                dataGridViewKhenThuong.DataSource = khenthuongs;
                dataGridViewKhenThuong.Columns["makt"].Visible = false;
                dataGridViewKhenThuong.Columns["ngay"].HeaderText = "Ngày ký";
                dataGridViewKhenThuong.Columns["thanhtich"].HeaderText = "Thành tích";
                dataGridViewKhenThuong.Columns["hinhthuc"].HeaderText = "Hình thức khen thưởng";
                dataGridViewKhenThuong.Columns["trigia"].HeaderText = "Trị giá phần thưởng";
            }
            catch (Exception)
            {
                dataGridViewKhenThuong.Rows.Clear();
            }
        }

        private void Load_KyLuat(int MaNV)
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            //NhanVien nv = new NhanVien();
            var kyluats = from kl in dc.Chitietkyluats
                              where kl.maNV == MaNV
                              select new
                              {
                                  makl = kl.maKyLuat,
                                  ngay = kl.KyLuat.NgayKy,
                                  lydo = kl.KyLuat.lyDo,
                                  hinhthuc = kl.KyLuat.hinhThuc,
                              };
            try
            {
                kyluats.First();
                dataGridViewLyLuat.DataSource = kyluats;
                dataGridViewLyLuat.Columns["makl"].Visible = false;
                dataGridViewLyLuat.Columns["ngay"].HeaderText = "Ngày ký";
                dataGridViewLyLuat.Columns["lydo"].HeaderText = "Lý do kỷ luật";
                dataGridViewLyLuat.Columns["hinhthuc"].HeaderText = "Hình thức kỷ luật";
            }
            catch (Exception)
            {
                dataGridViewLyLuat.Rows.Clear();
            }
        }

        private DataTable TaoTableHopDong(IQueryable<NOIDUNGHOPDONG> input)
        {
            DataTable result = new DataTable();
            result.Columns.Add("MaHD");
            result.Columns.Add("Loại hợp đồng");
            result.Columns.Add("Ngày ký");
            result.Columns.Add("Ngày bắt đầu");
            result.Columns.Add("Ngày hết hạn");
            result.Columns.Add("Số lần thay đổi");

            foreach (var r in input)
            {
                DataRow row = result.NewRow();
                row["MaHD"] = r.maHD;
                row["Loại hợp đồng"] = r.HopDong.LOAIHOPDONG.tenLoaiHD;
                row["Ngày ký"] = r.ngayKy;
                row["Ngày bắt đầu"] = r.ngayBatDau;
                row["Ngày hết hạn"] = r.ngayKetThuc;
                row["Số lần thay đổi"] = r.lanThayDoi;
                result.Rows.Add(row);
            }
            return result;
        }

        private void Load_HopDong(int MaNV)
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            //NhanVien nv = new NhanVien();
            var hopdongs = from hd in dc.NOIDUNGHOPDONGs
                           where hd.lanThayDoi == hd.HopDong.lanThayDoi && hd.HopDong.maNV == MaNV
                           select hd;

            dataGridViewHopDong.DataSource = TaoTableHopDong(hopdongs);
            dataGridViewHopDong.Columns["MaHD"].Visible = false;
        }
        #endregion

        #region Xử lý sự kiện thay đổi thông tin bổ trợ cho nhân viên
        private void tabPageNghiPhep_Enter(object sender, EventArgs e)
        {
            if (!NghiPhep_Loaded)
            {
                if (dataGridView1.SelectedRows.Count < 1)
                {
                    return;
                }
                if (dataGridView1.SelectedRows[0].IsNewRow)
                {
                    return;
                }
                Load_NghiPhep(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
            }
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count < 1)
            {
                return;
            }
            if (dataGridView1.SelectedRows[0].Cells["MaNV"].Value != DBNull.Value)
            {
                NghiPhep_Loaded = false;
                KhenThuong_Loaded = false;
                KyLuat_Loaded = false;
                HopDong_Loaded = false;

                switch (tabControl1.SelectedTab.Name)
                {
                    case "tabPageNghiPhep":
                        Load_NghiPhep(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
                        break;
                    case "tabPageKhenThuong":
                        Load_KhenThuong(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
                        break;
                    case "tabPageKyLuat":
                        Load_KyLuat(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
                        break;
                    case "tabPageHopDong":
                        Load_HopDong(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
                        break;
                    default:
                        break;
                }
            }
        }

        private void tabPageKhenThuong_Enter(object sender, EventArgs e)
        {
            if (!KhenThuong_Loaded)
            {
                if (dataGridView1.SelectedRows.Count < 1)
                {
                    return;
                }
                if (dataGridView1.SelectedRows[0].IsNewRow)
                {
                    return;
                }
                Load_KhenThuong(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
            }
        }

        private void tabPageKyLuat_Enter(object sender, EventArgs e)
        {
            if (!KyLuat_Loaded)
            {
                if (dataGridView1.SelectedRows.Count < 1)
                {
                    return;
                }
                if (dataGridView1.SelectedRows[0].IsNewRow)
                {
                    return;
                }
                Load_KyLuat(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
            }
        }

        private void tabPageHopDong_Enter(object sender, EventArgs e)
        {
            if (!HopDong_Loaded)
            {
                if (dataGridView1.SelectedRows.Count < 1)
                {
                    return;
                }
                if (dataGridView1.SelectedRows[0].IsNewRow)
                {
                    return;
                }
                Load_HopDong(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
            }
        }
        #endregion

        private void btNghiPhep_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count < 1)
            {
                return;
            }
            if (dataGridView1.SelectedRows[0].Cells["MaNV"].Value != DBNull.Value)
            {
                frmNghiPhep n = new frmNghiPhep(int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString()));
                if (n.ShowDialog() == DialogResult.OK)
                {
                    Load_NghiPhep(n.MaNV);
                }
            }
        }

        private void dataGridViewNghiPhep_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex < 0)
            {
                return;
            }
            if (dataGridViewNghiPhep.Rows[e.RowIndex].Cells["maNghiPhep"].Value != DBNull.Value)
            {
                frmNghiPhep ttnv = new frmNghiPhep(int.Parse(dataGridViewNghiPhep.Rows[e.RowIndex].Cells["maNV"].Value.ToString()));
                ttnv.MaNghiPhep = int.Parse(dataGridViewNghiPhep.Rows[e.RowIndex].Cells["maNghiPhep"].Value.ToString());
                if (ttnv != null)
                {
                    if (ttnv.ShowDialog() == DialogResult.OK)
                        Load_NghiPhep(ttnv.MaNV);
                }
                else
                    MessageBox.Show("Không tạo được form.");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show(this.WindowState.ToString());
            

            //frmKyLuat kt = new frmKyLuat(1);
            //kt.ShowDialog();

            //DataTable ds = (DataTable)dataGridView1.DataSource;
            //var r = ds.NewRow();
            //r["Họ Tên"] = "abcdef ghekjj l";
            //ds.Rows.Add(r);

            //QLNS_TLDataContext dc = new QLNS_TLDataContext();
            //var n = dc.NhanViens.SingleOrDefault(nvs => nvs.maNV == 1);
            //if (n == null)
            //{
            //    MessageBox.Show("null");
            //}
            //else
            //    if (n.soDT == null)
            //    {
            //        MessageBox.Show("SDT null");
            //    }
            //    else
            //        MessageBox.Show(n.soDT);
        }

        private void btThemNV_Click(object sender, EventArgs e)
        {
            Thong_Tin_Nhan_Vien ttnv = new Thong_Tin_Nhan_Vien();
            if(ttnv.ShowDialog() == DialogResult.OK)
                Load_DataGridView1();
        }

        private void btNghiViec_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count < 1)
            {
                return;
            }
            if (dataGridView1.SelectedRows[0].Cells["MaNV"].Value != DBNull.Value)
            {
                if (MessageBox.Show("Bạn có chắc là nhân viên sẽ nghỉ việc?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    int maNV = int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString());
                    QLNS_TLDataContext dc = new QLNS_TLDataContext();
                    var nv = dc.NhanViens.SingleOrDefault(n => n.maNV == maNV);
                    if (nv != null)
                    {
                        nv.active = false;
                        dc.SubmitChanges();
                        MessageBox.Show("Đã lưu nhân viên vào tình trạng nghỉ việc.");
                        Load_DataGridView1();
                    } 
                }
            }
        }

        private void btXoa_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count < 1)
            {
                return;
            }
            if (dataGridView1.SelectedRows[0].Cells["MaNV"].Value != DBNull.Value)
            {
                if (MessageBox.Show("Bạn có chắc là muốn xóa nhân viên?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    int maNV = int.Parse(dataGridView1.SelectedRows[0].Cells["MaNV"].Value.ToString());
                    QLNS_TLDataContext dc = new QLNS_TLDataContext();
                    var nv = dc.NhanViens.SingleOrDefault(n => n.maNV == maNV);
                    if (nv != null)
                    {
                        try
                        {
                            dc.NhanViens.DeleteOnSubmit(nv);
                            dc.SubmitChanges();
                            MessageBox.Show("Đã xóa nhân viên.");
                            Load_DataGridView1();
                        }
                        catch (Exception)
                        {
                            MessageBox.Show("Không thể xóa nhân viên.");
                        }
                    }
                }
            }
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            Load_DataGridView1();
        }
    }
}
